#include<math.h>

double modf(double x,double *iptr)
{
    union {double f;uint64_t i;} u={x};
    uint64_t mask;
    int e=(int)(u.i>>52&0x7ff)-0x3ff;
    
    //no fractional part
    if(e>=52)
    {
        *iptr=x;
        if(e==0x400&&u.i<<12!=0)    //nan
            return x;
        u.i&=1ULL<<63;
        return u.f;
    }

    //no integral part
    if(e<0)
    {
        u.i&=1ULL<<63;
        *iptr=u.f;
        return x;
    }

    mask=-1ULL>>12>>e;
    if(!(u.i&mask))
    {
        *iptr=x;
        u.i&=1ULL<<63;
        return u.f;
    }
    u.i&=~mask;
    *iptr=u.f;
    return x-u.f;
}